﻿using System;
using System.Data.SqlClient;
using System.Data;
using System.Collections.Generic;
using SeguradoraIA.Framework.Data;
using SeguradoraIA.Framework.Log;
using SeguradoraIA.Data.TO;

namespace SeguradoraIA.Data.Impl
{
    public class PerfilDAO : IPerfilDAO
    {
		#region 'Conexao'
        private const string ConnectionString = "SeguradoraIA";
		#endregion
		
		#region 'Metodos padrao'

        #region 'ObterTodos'
        /// <summary>Metodo encarregado de obter todos os registros.</summary>
        /// <returns>Lista da entidade</returns>
        /// <remarks>BSI</remarks>
        public IList<PerfilTO> ObterTodos()
        {
            IList<PerfilTO> listTO = new List<PerfilTO>();

            const string statement = "Perfil_SPS";
            LogManager.LogSQL(statement);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString,
                CommandType.StoredProcedure, statement))
            {
                while (rdr.Read())
                {
                    listTO.Add(ExtractData(rdr));
                }
            }

            LogManager.LogReturn(listTO);
            return listTO;
        }
        #endregion
        
        // Por não haver PK, este método não pode manipular o registro específico, causando um comportamento diferente do esperado
        #region 'Obter'
        /// <summary>Metodo encarregado de obter um registro. Busca realizada pela chave primaria da tabela.</summary>
        /// <returns>Entidade</returns>
        /// <remarks>BSI</remarks>
        public PerfilTO Obter(int idBairro, int idGrauInstrucao, int idIdade, int idMarcaCarro, int idPerfil, int idProfissao, int idSinistro, int idTempoHabilitacao, int idTipoCarro, int idTipoFormacao, int idValorCarro)
        {
            LogManager.LogEntryParameters(idBairro, idGrauInstrucao, idIdade, idMarcaCarro, idPerfil, idProfissao, idSinistro, idTempoHabilitacao, idTipoCarro, idTipoFormacao, idValorCarro);

            PerfilTO to = null;

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@idBairro",SqlDbType.Int){Value = idBairro}, 
				new SqlParameter("@idGrauInstrucao",SqlDbType.Int){Value = idGrauInstrucao}, 
				new SqlParameter("@idIdade",SqlDbType.Int){Value = idIdade}, 
				new SqlParameter("@idMarcaCarro",SqlDbType.Int){Value = idMarcaCarro}, 
				new SqlParameter("@idPerfil",SqlDbType.Int){Value = idPerfil}, 
				new SqlParameter("@idProfissao",SqlDbType.Int){Value = idProfissao}, 
				new SqlParameter("@idSinistro",SqlDbType.Int){Value = idSinistro}, 
				new SqlParameter("@idTempoHabilitacao",SqlDbType.Int){Value = idTempoHabilitacao}, 
				new SqlParameter("@idTipoCarro",SqlDbType.Int){Value = idTipoCarro}, 
				new SqlParameter("@idTipoFormacao",SqlDbType.Int){Value = idTipoFormacao}, 
				new SqlParameter("@idValorCarro",SqlDbType.Int){Value = idValorCarro} 
            };
            
            const string statement = "Perfil_SPS";
            LogManager.LogSQL(statement, parameters);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray()))
                if (rdr.Read())
                {
                    to = ExtractData(rdr);
                }

            return to;
        }
        #endregion
        
        #region 'Listar'
        /// <summary>Metodo encarregado de obter uma lista de registros. Busca realizada por um ou mais campos da entidade.</summary>
        /// <returns>Lista da entidade</returns>
        /// <remarks>BSI</remarks>
        public IList<PerfilTO> Listar(PerfilTO to)
        {
            IList<PerfilTO> listTO = new List<PerfilTO>();

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@Descricao",SqlDbType.NVarChar,-1){Value = to.Descricao ??(object) DBNull.Value}, 
				new SqlParameter("@IdBairro",SqlDbType.Int){Value = to.IdBairro > 0 ? (object)to.IdBairro : DBNull.Value}, 
				new SqlParameter("@IdGrauInstrucao",SqlDbType.Int){Value = to.IdGrauInstrucao > 0 ? (object)to.IdGrauInstrucao : DBNull.Value}, 
				new SqlParameter("@IdIdade",SqlDbType.Int){Value = to.IdIdade > 0 ? (object)to.IdIdade : DBNull.Value}, 
				new SqlParameter("@IdMarcaCarro",SqlDbType.Int){Value = to.IdMarcaCarro > 0 ? (object)to.IdMarcaCarro : DBNull.Value}, 
				new SqlParameter("@IdPerfil",SqlDbType.Int){Value = to.IdPerfil > 0 ? (object)to.IdPerfil : DBNull.Value}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao > 0 ? (object)to.IdProfissao : DBNull.Value}, 
				new SqlParameter("@IdSinistro",SqlDbType.Int){Value = to.IdSinistro > 0 ? (object)to.IdSinistro : DBNull.Value}, 
				new SqlParameter("@IdTempoHabilitacao",SqlDbType.Int){Value = to.IdTempoHabilitacao > 0 ? (object)to.IdTempoHabilitacao : DBNull.Value}, 
				new SqlParameter("@IdTipoCarro",SqlDbType.Int){Value = to.IdTipoCarro > 0 ? (object)to.IdTipoCarro : DBNull.Value}, 
				new SqlParameter("@IdTipoFormacao",SqlDbType.Int){Value = to.IdTipoFormacao > 0 ? (object)to.IdTipoFormacao : DBNull.Value}, 
				new SqlParameter("@IdValorCarro",SqlDbType.Int){Value = to.IdValorCarro > 0 ? (object)to.IdValorCarro : DBNull.Value}, 
				new SqlParameter("@PesoBairro",SqlDbType.Int){Value = to.PesoBairro > 0 ? (object)to.PesoBairro : DBNull.Value}, 
				new SqlParameter("@PesoGrauInstrucao",SqlDbType.Int){Value = to.PesoGrauInstrucao > 0 ? (object)to.PesoGrauInstrucao : DBNull.Value}, 
				new SqlParameter("@PesoIdade",SqlDbType.Int){Value = to.PesoIdade > 0 ? (object)to.PesoIdade : DBNull.Value}, 
				new SqlParameter("@PesoMarcaCarro",SqlDbType.Int){Value = to.PesoMarcaCarro > 0 ? (object)to.PesoMarcaCarro : DBNull.Value}, 
				new SqlParameter("@PesoProfissao",SqlDbType.Int){Value = to.PesoProfissao > 0 ? (object)to.PesoProfissao : DBNull.Value}, 
				new SqlParameter("@PesoSinistro",SqlDbType.Int){Value = to.PesoSinistro > 0 ? (object)to.PesoSinistro : DBNull.Value}, 
				new SqlParameter("@PesoTempoHabilitacao",SqlDbType.Int){Value = to.PesoTempoHabilitacao > 0 ? (object)to.PesoTempoHabilitacao : DBNull.Value}, 
				new SqlParameter("@PesoTipoCarro",SqlDbType.Int){Value = to.PesoTipoCarro > 0 ? (object)to.PesoTipoCarro : DBNull.Value}, 
				new SqlParameter("@PesoTipoFormacao",SqlDbType.Int){Value = to.PesoTipoFormacao > 0 ? (object)to.PesoTipoFormacao : DBNull.Value}, 
				new SqlParameter("@PesoValorCarro",SqlDbType.Int){Value = to.PesoValorCarro > 0 ? (object)to.PesoValorCarro : DBNull.Value} 
            };
            
            const string statement = "Perfil_SPS";
            LogManager.LogSQL(statement, parameters);

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(
                ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray()))
                while (rdr.Read())
                {
                    listTO.Add(ExtractData(rdr));
                }

            return listTO;
        }
        #endregion
		
		#region 'Inserir'
        /// <summary>Metodo encarregado de inserir um registro.</summary>
        /// <returns>Entidade inserida.</returns>
        /// <remarks>BSI</remarks>
        public void Inserir(PerfilTO to)        {
            LogManager.LogEntryParameters(to);

            List<SqlParameter> parameters = new List<SqlParameter>{
				new SqlParameter("@Descricao",SqlDbType.NVarChar,-1){Value = to.Descricao}, 
				new SqlParameter("@IdBairro",SqlDbType.Int){Value = to.IdBairro}, 
				new SqlParameter("@IdGrauInstrucao",SqlDbType.Int){Value = to.IdGrauInstrucao}, 
				new SqlParameter("@IdIdade",SqlDbType.Int){Value = to.IdIdade}, 
				new SqlParameter("@IdMarcaCarro",SqlDbType.Int){Value = to.IdMarcaCarro}, 
				new SqlParameter("@IdPerfil",SqlDbType.Int){Value = to.IdPerfil}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao}, 
				new SqlParameter("@IdSinistro",SqlDbType.Int){Value = to.IdSinistro}, 
				new SqlParameter("@IdTempoHabilitacao",SqlDbType.Int){Value = to.IdTempoHabilitacao}, 
				new SqlParameter("@IdTipoCarro",SqlDbType.Int){Value = to.IdTipoCarro}, 
				new SqlParameter("@IdTipoFormacao",SqlDbType.Int){Value = to.IdTipoFormacao}, 
				new SqlParameter("@IdValorCarro",SqlDbType.Int){Value = to.IdValorCarro}, 
				new SqlParameter("@PesoBairro",SqlDbType.Int){Value = to.PesoBairro}, 
				new SqlParameter("@PesoGrauInstrucao",SqlDbType.Int){Value = to.PesoGrauInstrucao}, 
				new SqlParameter("@PesoIdade",SqlDbType.Int){Value = to.PesoIdade}, 
				new SqlParameter("@PesoMarcaCarro",SqlDbType.Int){Value = to.PesoMarcaCarro}, 
				new SqlParameter("@PesoProfissao",SqlDbType.Int){Value = to.PesoProfissao}, 
				new SqlParameter("@PesoSinistro",SqlDbType.Int){Value = to.PesoSinistro}, 
				new SqlParameter("@PesoTempoHabilitacao",SqlDbType.Int){Value = to.PesoTempoHabilitacao}, 
				new SqlParameter("@PesoTipoCarro",SqlDbType.Int){Value = to.PesoTipoCarro}, 
				new SqlParameter("@PesoTipoFormacao",SqlDbType.Int){Value = to.PesoTipoFormacao}, 
				new SqlParameter("@PesoValorCarro",SqlDbType.Int){Value = to.PesoValorCarro}
            };
            
            const string statement = "Perfil_SPI";
            LogManager.LogSQL(statement, parameters);

            var returnCode = SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(returnCode);

            to.IdPerfil = System.Convert.ToInt32(returnCode);
        }

		#endregion
		
		// Por não haver PK, este método não pode manipular o registro específico, causando um comportamento diferente do esperado
		#region 'Excluir'
        /// <summary>Metodo encarregado de excluir um registro.</summary>
        /// <remarks>BSI</remarks> 
        public void Excluir(int idBairro, int idGrauInstrucao, int idIdade, int idMarcaCarro, int idPerfil, int idProfissao, int idSinistro, int idTempoHabilitacao, int idTipoCarro, int idTipoFormacao, int idValorCarro)
        {
            LogManager.LogEntryParameters(idBairro, idGrauInstrucao, idIdade, idMarcaCarro, idPerfil, idProfissao, idSinistro, idTempoHabilitacao, idTipoCarro, idTipoFormacao, idValorCarro);

            List<SqlParameter> parameters = new List<SqlParameter> { 
				new SqlParameter("@idBairro",SqlDbType.Int){Value = idBairro}, 
				new SqlParameter("@idGrauInstrucao",SqlDbType.Int){Value = idGrauInstrucao}, 
				new SqlParameter("@idIdade",SqlDbType.Int){Value = idIdade}, 
				new SqlParameter("@idMarcaCarro",SqlDbType.Int){Value = idMarcaCarro}, 
				new SqlParameter("@idPerfil",SqlDbType.Int){Value = idPerfil}, 
				new SqlParameter("@idProfissao",SqlDbType.Int){Value = idProfissao}, 
				new SqlParameter("@idSinistro",SqlDbType.Int){Value = idSinistro}, 
				new SqlParameter("@idTempoHabilitacao",SqlDbType.Int){Value = idTempoHabilitacao}, 
				new SqlParameter("@idTipoCarro",SqlDbType.Int){Value = idTipoCarro}, 
				new SqlParameter("@idTipoFormacao",SqlDbType.Int){Value = idTipoFormacao}, 
				new SqlParameter("@idValorCarro",SqlDbType.Int){Value = idValorCarro} 
            };

            const string statement = "Perfil_SPD";
            LogManager.LogSQL(statement, parameters);

            var afectedRows = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(afectedRows);
        }        
		#endregion

		#region 'Atualizar'
        /// <summary>Metodo encarregado de atualizar um registro.</summary>
        /// <returns>Entidade atualizada.</returns>
        /// <remarks>BSI</remarks>
        public void Atualizar(PerfilTO to)
        {
            LogManager.LogEntryParameters(to);

            List<SqlParameter> parameters = new List<SqlParameter>{ 
				new SqlParameter("@Descricao",SqlDbType.NVarChar,-1){Value = to.Descricao}, 
				new SqlParameter("@IdBairro",SqlDbType.Int){Value = to.IdBairro}, 
				new SqlParameter("@IdGrauInstrucao",SqlDbType.Int){Value = to.IdGrauInstrucao}, 
				new SqlParameter("@IdIdade",SqlDbType.Int){Value = to.IdIdade}, 
				new SqlParameter("@IdMarcaCarro",SqlDbType.Int){Value = to.IdMarcaCarro}, 
				new SqlParameter("@IdPerfil",SqlDbType.Int){Value = to.IdPerfil}, 
				new SqlParameter("@IdProfissao",SqlDbType.Int){Value = to.IdProfissao}, 
				new SqlParameter("@IdSinistro",SqlDbType.Int){Value = to.IdSinistro}, 
				new SqlParameter("@IdTempoHabilitacao",SqlDbType.Int){Value = to.IdTempoHabilitacao}, 
				new SqlParameter("@IdTipoCarro",SqlDbType.Int){Value = to.IdTipoCarro}, 
				new SqlParameter("@IdTipoFormacao",SqlDbType.Int){Value = to.IdTipoFormacao}, 
				new SqlParameter("@IdValorCarro",SqlDbType.Int){Value = to.IdValorCarro}, 
				new SqlParameter("@PesoBairro",SqlDbType.Int){Value = to.PesoBairro}, 
				new SqlParameter("@PesoGrauInstrucao",SqlDbType.Int){Value = to.PesoGrauInstrucao}, 
				new SqlParameter("@PesoIdade",SqlDbType.Int){Value = to.PesoIdade}, 
				new SqlParameter("@PesoMarcaCarro",SqlDbType.Int){Value = to.PesoMarcaCarro}, 
				new SqlParameter("@PesoProfissao",SqlDbType.Int){Value = to.PesoProfissao}, 
				new SqlParameter("@PesoSinistro",SqlDbType.Int){Value = to.PesoSinistro}, 
				new SqlParameter("@PesoTempoHabilitacao",SqlDbType.Int){Value = to.PesoTempoHabilitacao}, 
				new SqlParameter("@PesoTipoCarro",SqlDbType.Int){Value = to.PesoTipoCarro}, 
				new SqlParameter("@PesoTipoFormacao",SqlDbType.Int){Value = to.PesoTipoFormacao}, 
				new SqlParameter("@PesoValorCarro",SqlDbType.Int){Value = to.PesoValorCarro} 
            };

            const string statement = "Perfil_SPU";
            LogManager.LogSQL(statement, parameters);

            var afectedRows = SqlHelper.ExecuteNonQuery(ConnectionString, CommandType.StoredProcedure, statement, parameters.ToArray());
            LogManager.LogReturn(afectedRows);
        }
        #endregion
		   
		#region 'ExtractData'
        /// <summary>Extracao de dados do DataReader para uma entidade</summary>
        /// <returns>Entidade preenchida.</returns>
        /// <remarks>BSI</remarks>    
        private static PerfilTO ExtractData(IDataRecord rdr)
        {
            return new PerfilTO
            { 				Descricao = rdr.GetString(rdr.GetOrdinal("Descricao")), 
				IdBairro = rdr.GetInt32(rdr.GetOrdinal("IdBairro")), 
				IdGrauInstrucao = rdr.GetInt32(rdr.GetOrdinal("IdGrauInstrucao")), 
				IdIdade = rdr.GetInt32(rdr.GetOrdinal("IdIdade")), 
				IdMarcaCarro = rdr.GetInt32(rdr.GetOrdinal("IdMarcaCarro")), 
				IdPerfil = rdr.GetInt32(rdr.GetOrdinal("IdPerfil")), 
				IdProfissao = rdr.GetInt32(rdr.GetOrdinal("IdProfissao")), 
				IdSinistro = rdr.GetInt32(rdr.GetOrdinal("IdSinistro")), 
				IdTempoHabilitacao = rdr.GetInt32(rdr.GetOrdinal("IdTempoHabilitacao")), 
				IdTipoCarro = rdr.GetInt32(rdr.GetOrdinal("IdTipoCarro")), 
				IdTipoFormacao = rdr.GetInt32(rdr.GetOrdinal("IdTipoFormacao")), 
				IdValorCarro = rdr.GetInt32(rdr.GetOrdinal("IdValorCarro")), 
				PesoBairro = rdr.GetInt32(rdr.GetOrdinal("PesoBairro")), 
				PesoGrauInstrucao = rdr.GetInt32(rdr.GetOrdinal("PesoGrauInstrucao")), 
				PesoIdade = rdr.GetInt32(rdr.GetOrdinal("PesoIdade")), 
				PesoMarcaCarro = rdr.GetInt32(rdr.GetOrdinal("PesoMarcaCarro")), 
				PesoProfissao = rdr.GetInt32(rdr.GetOrdinal("PesoProfissao")), 
				PesoSinistro = rdr.GetInt32(rdr.GetOrdinal("PesoSinistro")), 
				PesoTempoHabilitacao = rdr.GetInt32(rdr.GetOrdinal("PesoTempoHabilitacao")), 
				PesoTipoCarro = rdr.GetInt32(rdr.GetOrdinal("PesoTipoCarro")), 
				PesoTipoFormacao = rdr.GetInt32(rdr.GetOrdinal("PesoTipoFormacao")), 
				PesoValorCarro = rdr.GetInt32(rdr.GetOrdinal("PesoValorCarro")), 
 };
        }
        #endregion
        
        #endregion
    }
}